home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / share / Dos / VARIOS / pascal / SWAG9605.DDD / 0007_Re: Random Number Generator.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-05-31  |  1.0 KB  |  34 lines

  1. (************************************* function  Generate   *************)
  2. function Generate (var Seed: longint): real;
  3.  
  4. {  Algorithm 2 from CACM, pg. 1195, vol. 31, no. 10, (October, 1988).    }
  5. {  modified for longint values as recommended in Cooper, D. 1993         }
  6. {  Oh! Pascal!, 3rd edition, pp. A16-A17                                 }
  7.  
  8. const
  9.    MODULUS    = 2147483647;
  10.    MULTIPLIER = 16807;
  11.    QUOTIENT   = 127773;    {MODULUS div MULTIPLIER}
  12.    REMAINDER  = 2836;      {MODULUS mod MULTIPLIER}
  13.  
  14. var
  15.    Low, Hi, Test: longint;
  16.  
  17. begin
  18. {First, perform the calculation while avoiding overflow.}
  19.    Hi   := Seed div QUOTIENT;
  20.    Low  := Seed mod QUOTIENT;
  21.    Test := (MULTIPLIER * Low) - (REMAINDER * Hi);
  22.  
  23. {Second, update the seed for next time.}
  24.    if Test > 0 then
  25.       Seed := Test
  26.    else
  27.       Seed := Test + MODULUS;
  28.  
  29. {Third, return a value in the range 0.0 < Generate  < 1.0}
  30.    Generate := Seed / MODULUS;
  31. end;
  32. (************************************* function  Generate end ***********)
  33.  
  34.